package com.ikcai.deepcopy;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
/**
 * <p>标题： 深拷贝</p>
 * <p>功能： 对象的深拷贝功能实现采用输入输出流</p>
 * <p>所属模块： CUST</p>
 * <p>版权： Copyright © 2016 SNSOFT</p>
 * <p>公司: 北京南北天地科技股份有限公司</p>
 * <p>创建日期：2016年10月9日 上午11:36:07</p>
 * <p>类全名：com.ikcai.deepcopy.DeepCopy</p>
 * 作者：赵力
 * 初审：
 * 复审：
 * 监听使用界面:
 * @version 8.0
 */
public class DeepCopy
{
	/**
	 * 深拷贝优化前
	 * @param obj
	 * @return
	 * @throws Exception
	 * 赵力
	 */
	public static Object getDeepClone(Object obj) throws Exception
	{
		//序列化
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(obj);
		oos.flush();
		oos.close();
		//反序列化
		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bis);
		return ois.readObject();
	}

	/**
	 * 深拷贝优化后
	 * @param obj
	 * @return
	 * @throws IOException
	 * @throws Exception
	 * 赵力
	 */
	public static <T> T clone(T obj) throws Exception
	{
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try
		{
			oos = new ObjectOutputStream(bos);
			oos.writeObject(obj);
			oos.flush();
			ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
			ois = new ObjectInputStream(bis);
			return (T) ois.readObject();
		} finally
		{
			//关闭流对象
			if (oos != null)
			{
				oos.close();
			}
			if (ois != null)
			{
				ois.close();
			}
		}
	}

	public static void main(String[] args)
	{
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("name", "zhangsan");
		map.put("age", 18);
		map.put("email", "test@qq.com");
		try
		{
			@SuppressWarnings("unchecked")
			Map<String,Object> copymap = (Map<String,Object>) DeepCopy.getDeepClone(map);
			map.put("age", 19);
			map.put("email", "test@163.com");
			System.out.println((int) map.get("age") + "-" + (String) map.get("email"));
			System.out.println((int) copymap.get("age") + "-" + (String) copymap.get("email"));
		} catch (Exception e)
		{
			throw new RuntimeException("报错内容", e);
		}
	}
}
